﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.sstq
    求对称三对角阵的特征值
    参数 n: 
    参数 b: b[n]存放n阶实对称三角阵的主对角线上的元素。返回时存放全部特征值。
    参数 c: c[n]前n-1个元素存放实对称三角阵的次对角线上的元素。
    参数 q: q[n][n]若存放n阶单位矩阵，则返回实对称三对角阵T的特征向量组；
    若存放由3.1节中的函数strq()所返回的一般实对称矩阵A的豪斯荷尔德变换的乘积矩阵Q，则返回实对称矩阵A的特征向量组。
    其中q中的第j列为与数组b中第j个特征值对应的特征向量。
    参数 eps: 控制精度要求。
    参数 inter: 最多迭代次数，100
    返回值 返回的标志值为迭代次数。本程序最多迭代100次。
    */

    public static string drive_sstq()
    {
        int i, j, k;
        double[,] q = new double[5, 5];
        double[] b = new double[5];
        double[] c = new double[5];
        double[,] a = new double[5, 5]{
            {10.0,1.0,2.0,3.0,4.0},
            {1.0,9.0,-1.0,2.0,-3.0},
            {2.0,-1.0,7.0,3.0,-5.0},
            {3.0,2.0,3.0,12.0,-1.0},
            {4.0,-3.0,-5.0,-1.0,15.0}
        };
        int n = 5;
        double eps = 0.000001;

        string rs = "";
        rs = gl.html_table("原对称矩阵 A:", a);

        // 约化对称矩阵A为三对角阵
        i = gl.strq(a, n, q, b, c);
        if (i == 0) return "error: 0";

        rs = gl.html_table("乘积矩阵 Q:", q);
        rs = gl.html_table("对称三对角阵主对角线元素 B:", b);
        rs = gl.html_table("对称三对角阵次对角线元素 C:", c);

        // 求对称矩阵A的特征值
        k = gl.sstq(5, b, c, q, eps, 100);
        rs = gl.html_table("对称矩阵A的特征值(迭代次数=" + k + "):", b);
        rs = gl.html_table("对称矩阵A的特征向量组:", q);

        return rs;
    }
}